#include<stdio.h>
#include<stdlib.h>
#include<sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>


int main(int args, const char * argv[]){

	if(args < 3){
		perror("less args");
		exit(0);
	}

	int sockfd;
	struct sockaddr_in addr;
	socklen_t addrlen = sizeof(struct sockaddr_in);
	// BUFSIZ 8192
	char buf[BUFSIZ] = {0};  
	//1. 创建套接字：IPV4、UDP
	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(sockfd < 0){
		perror("socket");
		exit(0);
	}

	//地址快速重用：允许在同一端口上启动新的服务器，即使之前的服务器实例还没有完全关闭
	int flag = 1, len = sizeof(int);
	if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &flag, len) == -1){
		perror("setsockopt");
		exit(1);
	}

	//2. 绑定通信结构体
	addr.sin_family = AF_INET;
	//atoi:将字符串转化成整形数据
	addr.sin_port = htons(atoi(argv[2]));
#if 1
	if (inet_aton(argv[1], &addr.sin_addr) == 0) {
		fprintf(stderr, "Invalid address\n");
		exit(EXIT_FAILURE);
	}
#else
	addr.sin_addr.s_addr = inet_addr(argv[1]);
#endif

	//3. 往服务端发送数据
	while(1){
		bzero(buf, BUFSIZ);
		printf("Input->");
		fgets(buf, BUFSIZ, stdin);
		//UDP通信：即使服务端进程关闭了(或者服务端不启动)，该函数(客户端进程)仍然循环可以执行
		sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&addr, addrlen);
	}

	//4. 关闭套接字
	close(sockfd);
	return 0;
}
